#ifndef ARBRE_H

//type de noeud
#define AT_ID      	0
#define AT_NBPOS   	1
#define AT_NBNEG   	2
#define AT_ADD     	3
#define AT_MIN     	4
#define AT_MUL     	5
#define AT_OUT     	6
#define AT_IN      	7
#define AT_AFFECTL  	8
#define AT_MOD      	9
#define AT_ILISTCODE   	10
#define AT_ROOT    	11
#define AT_MAIN    	12
#define AT_DECL    	13
#define AT_DECLVAR 	14
#define AT_FCT	   	15
#define AT_LISTFCT  	16 
#define AT_CODE    	17
#define AT_INT		18
#define AT_AND	   	19
#define AT_OR      	20
#define AT_NOT     	21
#define AT_EQUAL   	22
#define AT_SMALLER 	23
#define AT_SMALLEQ 	24
#define AT_GREATER 	25
#define AT_GREATEQ 	26
#define AT_DIV   	27
#define AT_BOOL		28
#define AT_MATRIX	29
#define AT_LISTVAR  	30
#define AT_ARG     	31
#define AT_LISTARG 	32
#define AT_IF      	33
#define AT_WHILE   	34
#define AT_AFFECTR 	35
#define AT_SWAP    	36
#define AT_ALTERN  	37
#define AT_LISTINT 	38
#define AT_LISTBOOL 	39
#define AT_LISTMATRIX 	40
#define AT_GET     	41
#define AT_RETURN  	42
#define AT_CLONE   	43
#define AT_SET	   	44
#define AT_CREATE  	45
#define AT_CALLFCT      46
#define AT_CALLARG  	47
#define AT_LISTCALLARG 	48
#define AT_ARGVARINT    49
#define AT_ARGINT       50
#define AT_ARGVARBOOL   51
#define AT_ARGBOOL      52
#define AT_ARGVARMATRIX 53
#define AT_ARGMATRIX    54
#define AT_RT		55
#define AT_ILISTDECL	56

typedef struct node* TREE;
typedef struct node NODE; //pour pouvoir récupérer la taille d'un noeud lors de l'allocation dynamique de la mémoire

//noeud de base
struct node {
    int type;
    char* name;
    int value;
    int line;
	
    TREE left;
    TREE middle;
    TREE right;
    TREE other; 
};

TREE createNode(int type, int value, char* name,int line, TREE left, TREE middle, TREE right, TREE other);
/*
	a. Objets utilisés:
		i. Int type: le type de noeud (prend une des valeurs définies dans « arbre.h »).
		ii.Int value : la valeur éventuelle du nœud. Pour une constante entière, celle-ci vaut la constante, pour un booleen, la valeur est à 1 si il est à true et 0 					si il est à false.
		iii. Char* name : le nom du nœud. Si le type de nœud est AT_FCT, la variable name vaut le nom de la fonction (idem pour les variables).

		iv.Int line : le numéro de la ligne dans le code lsd11.

		v.TREE left : le sous-arbre de gauche.

		vi.TREE middle : le sous-arbre du milieu.

		vii.TREE right : le sous-arbre de droite.

		viii.TREE other : le quatrième sous-arbre.
	b. Pré-conditions : /
	c. Post-conditions : un nœud a été créé et ajouté à l’arbre.
	d. Description : crée un nouveau nœud de l’arbre.
*/

extern void freeTree(TREE tree);
/*
	a. Objets utilisés :
		i. TREE node : le pointeur vers le nœud de l’arbre à libérer.
	b. Pré-conditions : il existe un arbre.
	c. Post-conditions : l’espace mémoire occupé pour l’arbre a été libéré.
	d. Description : libère l’espace mémoire occupé par l’arbre.
*/

char* humanReadableNodeType(int type);
/*
	a. Objets utilisés :
		i. Int type : le type du nœud, un entier définit dans « arbre.h ».
	b. Pré-conditions : le type donné en paramètre est définit dans « arbre.h ».
	c. Post-conditions : la chaine de caractères correspondant au type a été retournée.
	d. Description : retourne la chaine de caractères correspondant au type donné.
*/

extern void printTree(TREE tree);

/*
	a. Objets utilisés :
		i. TREE tree : l’arbre à imprimer.
	b. Pré-conditions : /.
	c. Post-conditions : l’arbre a été imprimé à l’écran.
	d. Description : imprime un arbre à l’écran.
*/

extern void printTreeForDia(TREE tree, int nb);

/*
	a. Objets utilisés:
		i. TREE tree: l’arbre à imprimer
		ii.Int nb: nombre entier permettant de différencier les noeuds NULL. Évite que tous les pointeurs NULL pointent vers le même endroit.
	b. Pré-conditions: /.
	c. Post-conditions: l’arbre a été imprimé sous forme de graphe.
	d. Description:imprime l'arbre sous forme de graphe.
*/


#endif




